/**
 * by 菲鸽 on 2024-03-06
 * 路由拦截，通常也是登录拦截
 * 可以设置路由白名单，或者黑名单，看业务需要选哪一个
 * 我这里应为大部分都可以随便进入，所以使用黑名单
 */
import { useUserStore } from '@/store'
import { getNeedLoginPages, needLoginPages as _needLoginPages } from '@/utils'

// TODO Check
const loginRoute = '/pages/login/index'

const isDev = import.meta.env.DEV

// 黑名单登录拦截器 - （适用于大部分页面不需要登录，少部分页面需要登录）
const navigateToInterceptor = {
  // 注意，这里的url是 '/' 开头的，如 '/pages/index/index'，跟 'pages.json' 里面的 path 不同
  invoke({ url }) {
    const path = url.split('?')[0]
    let needLoginPages = []
    // 为了防止开发时出现BUG，这里每次都获取一下。生产环境可以移到函数外，性能更好
    if (isDev) {
      needLoginPages = getNeedLoginPages()
    } else {
      needLoginPages = _needLoginPages
    }
    const isNeedLogin = needLoginPages.includes(path)
    if (!isNeedLogin) {
      return true
    }
    const userStore = useUserStore()
    const hasLogin = userStore.isLogin
    console.log('hasLogin', url)
    if (hasLogin) {
      if (!userStore.userInfo) {
        // 这里不能使用 await，改为回调处理
        userStore
          .info()
          .then(() => {
            // 获取用户信息后继续跳转
            url = url === '/pages/login/index' ? '/pages/student/index/index' : url
            uni.navigateTo({ url })
          })
          .catch((err) => {
            console.error('获取用户信息失败', err)
          })
      } else {
        if(path === '/pages/login/index') {
          uni.reLaunch({
            url: '/pages/student/index/index'
          })
          return false
        }
        return true
      }
    }
    const redirectRoute = `${loginRoute}?redirect=${encodeURIComponent(url)}`
    uni.navigateTo({ url: redirectRoute })
    return false
  },
}

const switchTabInterceptor = {
  // 注意，这里的url是 '/' 开头的，如 '/pages/index/index'，跟 'pages.json' 里面的 path 不同
  invoke({ url }) {
  console.log(88888888888888)
    const path = url.split('?')[0]
    let needLoginPages = []
    // 为了防止开发时出现BUG，这里每次都获取一下。生产环境可以移到函数外，性能更好
    if (isDev) {
      needLoginPages = getNeedLoginPages()
    } else {
      needLoginPages = _needLoginPages
    }
    const isNeedLogin = needLoginPages.includes(path)
    if (!isNeedLogin) {
      console.log('hasLogin', 11111111)
      return true
    }
    const userStore = useUserStore()

    const hasLogin = userStore.isLogin
    console.log('hasLogin', url)

    if (hasLogin) {
      if (!userStore.userInfo) {
        // 这里不能使用 await，改为回调处理
        userStore
          .info()
          .then(() => {
            // 获取用户信息后继续跳转
            uni.switchTab({ url })
          })
          .catch((err) => {
            console.error('获取用户信息失败', err)
          })
          return false
      } else {
        return true
      }
    }
    const redirectRoute = `${loginRoute}?redirect=${encodeURIComponent(url)}`
    uni.navigateTo({ url: redirectRoute })
    return false
  },
}

export const routeInterceptor = {
  install() {
    uni.addInterceptor('navigateTo', navigateToInterceptor)
    uni.addInterceptor('reLaunch', navigateToInterceptor)
    uni.addInterceptor('redirectTo', navigateToInterceptor)
    uni.addInterceptor('switchTab', switchTabInterceptor)
  },
}
